#include <cstring>
#include <iostream>
using namespace std;

const int MOD = 1000000007;
const int MAX_N = 2001; // 增加1
const int MAX_STEPS = 2 * MAX_N - 1;

char grid[MAX_N][MAX_N]; // 存储网格
// 检查坐标是否在网格内且不是障碍物
bool isValid(int x, int y, int n) {
  return x >= 1 && x <= n && y >= 1 && y <= n && grid[x][y] != '#';
}

int dp[2][MAX_N][MAX_N]; // 使用滚动数组优化空间

// 分治函数
int divideAndConquer(int x1, int y1, int x2, int y2, int n) {
  // 基本情况：如果子网格大小为1x1
  if (x1 == x2 && y1 == y2) {
    return isValid(x1, y1, n) ? 1 : 0;
  }

  // 将子网格分成四个象限
  int midX = (x1 + x2) / 2;
  int midY = (y1 + y2) / 2;

  // 递归计算四个子网格的路径数
  int a = divideAndConquer(x1, y1, midX, midY, n);
  int b = divideAndConquer(x1, midY + 1, midX, y2, n);
  int c = divideAndConquer(midX + 1, y1, x2, midY, n);
  int d = divideAndConquer(midX + 1, midY + 1, x2, y2, n);

  // 合并结果，考虑跨越边界的路径
  int result = (a + b + c + d) % MOD;

  // 计算跨越边界的路径数
  for (int i = midX; i <= midX + 1; ++i) {
    for (int j = midY; j <= midY + 1; ++j) {
      if (isValid(i, j, n)) {
        if (i > x1 && isValid(i - 1, j, n)) {
          result = (result + a * d) % MOD;
        }
        if (j > y1 && isValid(i, j - 1, n)) {
          result = (result + b * c) % MOD;
        }
      }
    }
  }

  return result;
}

int main() {
  int n;
  cin >> n;

  // 读取网格
  for (int i = 1; i <= n; ++i) {
    cin >> (grid[i] + 1);
  }

  // 使用分治法计算路径数
  int result = divideAndConquer(1, 1, n, n, n);

  cout << result << endl;
  return 0;
}